home *** CD-ROM | disk | FTP | other *** search
Text File | 1999-06-26 | 14.4 KB | 625 lines | [TEXT/CWIE] |
- // StupidWay.c
- // Handle Life propagation the stupid, but simple way
- // Copyright ©1995 Michael D. Crawford. All Rights Reserved.
- // 23 Jun 95 Mike Crawford crawford@scruznet.com
- //
- // Revision History:
- // 27 Apr 97 DGC New today
-
- #include <QDOffscreen.h>
- #include "LifeModule.h"
- #include "StupidWay.h"
- void draw_line(vector unsigned short line, vector unsigned char * ptr,Handle ThePrivateData);
-
- typedef union
- {
- vector unsigned char v;
- unsigned char c;
- } vChar;
-
- int __stupid_start(void);
- int __stupid_start(void)
- {
- }
-
- OSErr PIDrawACell(Handle ThePrivateData,long x, long y)
- {
- return 0;
- }
-
- OSErr PICreateLife(Handle ThePrivateData,
- unsigned long *life_base,
- short rowbytes,
- long color)
- {
- if (ThePrivateData == nil)
- return -1;
-
- SetHandleSize(ThePrivateData,sizeof(tStupidData));
- if(!(((tStupidPtr)*ThePrivateData)->myDataTic = NewHandleClear(16*128)))
- {
- SetHandleSize(ThePrivateData, 0);
- return -1;
- }
- if(!(((tStupidPtr)*ThePrivateData)->myDataToc = NewHandleClear(16*128)))
- {
- DisposeHandle(((tStupidPtr)*ThePrivateData)->myDataTic);
- SetHandleSize(ThePrivateData, 0);
- return -1;
- }
-
- ((tStupidPtr)*ThePrivateData)->height = 128;
- ((tStupidPtr)*ThePrivateData)->width = 128;
- ((tStupidPtr)*ThePrivateData)->life_base = life_base;
- ((tStupidPtr)*ThePrivateData)->rowbytes = rowbytes;
- ((tStupidPtr)*ThePrivateData)->color = color;
- ((tStupidPtr)*ThePrivateData)->tic = true;
- return noErr;
- }
-
- void PISetColor(Handle ThePrivateData, long color)
- {
- ((tStupidPtr)*ThePrivateData)->color = color;
- }
-
- OSErr PITrashLife(Handle ThePrivateData)
- {
- if (ThePrivateData)
- {
- if (((tStupidPtr)*ThePrivateData)->myDataTic)
- {
- DisposeHandle(ThePrivateData);
- ((tStupidPtr)*ThePrivateData)->myDataTic = 0;
- }
- if (((tStupidPtr)*ThePrivateData)->myDataToc)
- {
- DisposeHandle(ThePrivateData);
- ((tStupidPtr)*ThePrivateData)->myDataToc = 0;
- }
- }
- return noErr;
- }
-
- OSErr PISetACell(Handle ThePrivateData,long x, long y, Boolean state)
- {
- vChar myX;
-
- vector unsigned char vX;
- vector unsigned char temp = (vector unsigned char)(0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
- myX.c = x;
- vX = vec_splat(myX.v,0);
-
- temp = vec_srl(temp,vX);
- temp = vec_sro(temp,vX);
-
- if (((tStupidPtr)*ThePrivateData)->tic)
- ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataTic))[y] = temp;
- else
- ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataToc))[y] = temp;
- return noErr;
- }
-
- Boolean PIReadACell(Handle ThePrivateData,long x, long y)
- {
- vChar myX;
-
- vector unsigned char vX;
- vector unsigned char data;
- vector unsigned char zero = (vector unsigned char)(0);
- vector unsigned char temp = (vector unsigned char)(0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
- myX.c = x;
- vX = vec_splat(myX.v,0);
-
- temp = vec_srl(temp,vX);
- temp = vec_sro(temp,vX);
-
- if (((tStupidPtr)*ThePrivateData)->tic)
- data = ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataTic))[y];
- else
- data = ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataToc))[y];
-
- data = vec_and(data,temp);
-
- return !vec_all_eq(data,zero);
- }
-
-
- OSErr PINextGeneration(Handle ThePrivateData)
- {
- long i;
- vector unsigned char line0, line1, line2, bit0, bit1, bit2, carry0, carry1,temp;
- vector unsigned char zero = (vector unsigned char)(0);
- vector unsigned char one = (vector unsigned char)(-1);
- vector unsigned char shiftOne = (vector unsigned char)(1);
-
- if (ThePrivateData == nil)
- return -1;
-
- if (((tStupidPtr)*ThePrivateData)->myDataTic == nil)
- return -1;
-
-
- if (((tStupidPtr)*ThePrivateData)->tic)
- {
- line0 = zero;
- line1 = zero;
- line2 = ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataTic))[0];
-
- for (i=0; i< 128; i++)
- {
- line0 = line1;
- line1 = line2;
- if (i!=127)
- line2 = ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataTic))[i+1];
- else
- line2 = zero;
-
- bit0 = zero;
- bit1 = zero;
- bit2 = one;
-
- temp = line0;
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_sll(line0,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_srl(line0,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_sll(line1,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_srl(line1,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = line2;
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_sll(line2,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_srl(line2,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
-
- bit1 = vec_and(bit1,bit2);
- bit0 = vec_or(bit0,line1);
- ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataTic))[i] = vec_and(bit1,bit0);
- }
- ((tStupidPtr)*ThePrivateData)->tic = false;
- }
- else
- {
-
- line0 = zero;
- line1 = zero;
- line2 = ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataToc))[0];
-
- for (i=0; i< 128; i++)
- {
- line0 = line1;
- line1 = line2;
- if (i!=127)
- line2 = ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataToc))[i+1];
- else
- line2 = zero;
-
- bit0 = zero;
- bit1 = zero;
- bit2 = one;
-
- temp = line0;
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_sll(line0,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_srl(line0,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_sll(line1,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_srl(line1,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = line2;
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_sll(line2,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
- temp = vec_srl(line2,shiftOne);
- carry0 = vec_and(bit0,temp);
- bit0 = vec_xor(bit0,temp);
- carry1 = vec_and(bit1,carry0);
- bit1 = vec_xor(bit1,carry0);
- bit2 = vec_xor(bit2,carry1);
-
-
- bit1 = vec_and(bit1,bit2);
- bit0 = vec_or(bit0,line1);
- ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataToc))[i] = vec_and(bit1,bit0);
- }
- ((tStupidPtr)*ThePrivateData)->tic = true;
- }
-
- return noErr;
- }
-
- OSErr PIDrawBoard(Handle ThePrivateData)
- {
- long y, rowbytes;
- vector unsigned char * data;
- vector unsigned char * ptr;
- vector unsigned char line;
-
- if (ThePrivateData == nil)
- return 0;
-
- if (((tStupidPtr)*ThePrivateData)->myDataTic == nil)
- return 0;
-
- data = (vector unsigned char *)(((tStupidPtr)*ThePrivateData)->life_base);
-
- rowbytes = ((tStupidPtr)*ThePrivateData)->rowbytes/4;
-
- for (y=0;y<128;y++)
- {
- ptr = data;
-
- if (((tStupidPtr)*ThePrivateData)->tic)
- {
- line = ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataTic))[y];
- draw_line((vector unsigned short) line, ptr, ThePrivateData);
- }
- else
- {
- line = ((vector unsigned char *)(*((tStupidPtr)*ThePrivateData)->myDataToc))[y];
- draw_line((vector unsigned short) line, ptr, ThePrivateData);
- }
-
- data += rowbytes;
- }
- return noErr;
- }
-
- void draw_line(vector unsigned short line, vector unsigned char * ptr,Handle ThePrivateData)
- {
- long j = 0;
- vector unsigned char cline;
- vector unsigned char t1;
- vector unsigned char t2;
- vector unsigned char t3;
- vector unsigned char t4;
- vector unsigned char t5;
- vector unsigned char out;
-
- vector unsigned char one = (vector unsigned char)(1);
- vector unsigned char shift_1 = (vector unsigned char)(4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0);
- vector unsigned char shift_2 = (vector unsigned char)(2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0);
- vector unsigned char shift_3 = (vector unsigned char)(1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0);
- vector unsigned char white = (vector unsigned char)(-1);
- vector unsigned char color;
-
- color = *(vector unsigned char*)&(((tStupidPtr)*ThePrivateData)->color) ;
-
- color = (vector unsigned char)vec_splat((vector unsigned long)color,0);
-
- cline = (vector unsigned char)line;
-
- t1 = vec_mergeh(cline,cline);
- t1 = vec_sr(t1,shift_1);
- {
- t2 = vec_mergeh(t1,t1);
- t2 = vec_sr(t2,shift_2);
- {
- t3 = vec_mergeh(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
-
- t3 = vec_mergel(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- }
-
- t2 = vec_mergel(t1,t1);
- t2 = vec_sr(t2,shift_2);
- {
- t3 = vec_mergeh(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- t3 = vec_mergel(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- }
-
- }
-
- t1 = vec_mergel(cline,cline);
- t1 = vec_sr(t1,shift_1);
- {
- t2 = vec_mergeh(t1,t1);
- t2 = vec_sr(t2,shift_2);
- {
- t3 = vec_mergeh(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- t3 = vec_mergel(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- }
- t2 = vec_mergel(t1,t1);
- t2 = vec_sr(t2,shift_2);
- {
- t3 = vec_mergeh(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- t3 = vec_mergel(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- }
- }
- }